{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 向量存储和检索器\n",
    "\n",
    "本教程将使您熟悉LangChain的向量存储和检索器抽象。这些抽象旨在支持从(向量)数据库和其他来源检索数据，以便与大型语言模型工作流集成。它们对于获取数据以进行推理的应用程序非常重要，例如：在检索增强生成(RAG) 的情况下(请参见我们的[RAG教程](https://www.langchain.com.cn/docs/tutorials/rag/))\n"
   ],
   "id": "c93774e57bc77bf4"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 概念\n",
    "\n",
    "本指南重点介绍文本数据的检索。我们将涵盖以下概念：\n",
    "- 文档；\n",
    "- 向量数据库；\n",
    "- 检索器。"
   ],
   "id": "710f23af267e6f19"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 文档\n",
    "\n",
    "LangChain实现了有一个[文档](https://python.langchain.com/api_reference/core/documents/langchain_core.documents.base.Document.html)抽象，旨在表示一个文本单元及其相关数据。它有两个属性：\n",
    "- `page_content`: 一个表示内容的字符串；\n",
    "- `metadata`: 一个包含有关文档的元数据的字典。"
   ],
   "id": "7c6197ad668f0974"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-24T06:57:01.666883Z",
     "start_time": "2025-09-24T06:57:01.662880Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# <!--IMPORTS:[{\"imported\": \"Document\", \"source\": \"langchain_core.documents\", \"docs\": \"https://python.langchain.com/api_reference/core/documents/langchain_core.documents.base.Document.html\", \"title\": \"Vector stores and retrievers\"}]-->\n",
    "\n",
    "from langchain_core.documents import Document\n",
    "from openai import embeddings\n",
    "\n",
    "documents = [\n",
    "    Document(\n",
    "        page_content=\"Dogs are great companions, known for their loyalty and friendliness.\",\n",
    "        metadata={\"source\": \"mammal-pets-doc\"}\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"Cats are independent pets that often enjoy their own space.\",\n",
    "        metadata={\"source\": \"mammal-pets-doc\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"Goldfish are popular pets for beginners, requiring relatively simple care.\",\n",
    "        metadata={\"source\": \"fish-pets-doc\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"Parrots are intelligent birds capable of mimicking human speech.\",\n",
    "        metadata={\"source\": \"bird-pets-doc\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"Rabbits are social animals that need plenty of space to hop around.\",\n",
    "        metadata={\"source\": \"mammal-pets-doc\"},\n",
    "    ),\n",
    "]"
   ],
   "id": "1e31d2d193c2dd1d",
   "outputs": [],
   "execution_count": 13
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "在这里，我们生成了五个文档，包含指示三个不同“来源”的元数据",
   "id": "af5f147462ea1b0e"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 向量存储\n",
    "\n",
    "向量搜索是一种常见的存储和搜索非结构化数据(例如非结构化文本)的方法。其思想是存储与文本相关联的数值向量。给定一个查询，我们可以将其[嵌入](https://www.langchain.com.cn/docs/concepts/#embedding-models)为相同维度的向量，并使用向量相似性度量来识别存储种的相关数据。\n",
    "\n",
    "LangChain[向量存](https://python.langchain.com/api_reference/core/vectorstores/langchain_core.vectorstores.VectorStore.html) 对象包含用于将文本和 `文档`对象添加到存储中以及使用各种相似性度量进行查询的方法。它们通常使用 [嵌入](https://www.langchain.com.cn/docs/how_to/embed_text/) 模型进行初始化，这决定了文本数据如何转化为数值向量。\n",
    "\n",
    "LangChain包含与不同向量存储技术的[集成](https://www.langchain.com.cn/docs/integrations/vectorstores/)套件。一些向量存储由提供商(例如各种云提供商)托管，并需要忒定的凭据才能使用；一些(如[Postgres](https://www.langchain.com.cn/docs/integrations/vectorstores/pgvector/)) 可以在本地运行或通过第三方运行的独立基础设施中运行；其他可以自内存中运行以处理轻量级工作负载。这里我们将演示使用[Chroma](https://www.langchain.com.cn/docs/integrations/vectorstores/chroma/)的LangChain向量存储，它包括一个内存实现。\n",
    "\n",
    "要实例化一个向量存储，我们通常需要提供一个[嵌入模型](https://www.langchain.com.cn/docs/how_to/embed_text/)，已指定文本应该如何转换为数值向量。这里我们将使用[OpenAI](https://www.langchain.com.cn/docs/integrations/text_embedding/openai/)\n",
    "\n",
    "\n",
    "安装langchain_chroma: ` pip install langchain_chroma -i https://pypi.tuna.tsinghua.edu.cn/simple/`\n",
    "\n",
    "### 阿里云百炼\n",
    "- https://www.langchain.com.cn/docs/integrations/text_embedding/dashscope/\n",
    "- embedding模型的使用\n",
    "- 官网：https://bailian.console.aliyun.com/?spm=5176.29619931.J__Z58Z6CX7MY__Ll8p1ZOR.1.6565521cKDtEZo&tab=globalset#/efm/api_key\n",
    "- ![image.png](attachment:3b1f51fb-af6c-47e3-8b02-c45dab0ccb2c.png)"
   ],
   "id": "3c7f7ad141234480",
   "attachments": {
    "3b1f51fb-af6c-47e3-8b02-c45dab0ccb2c.png": {
     "image/png": "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"
    }
   }
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-24T06:57:02.149984Z",
     "start_time": "2025-09-24T06:57:01.682514Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# <!--IMPORTS:[{\"imported\": \"Chroma\", \"source\": \"langchain_chroma\", \"docs\": \"https://python.langchain.com/api_reference/chroma/vectorstores/langchain_chroma.vectorstores.Chroma.html\", \"title\": \"Vector stores and retrievers\"}, {\"imported\": \"OpenAIEmbeddings\", \"source\": \"langchain_openai\", \"docs\": \"https://python.langchain.com/api_reference/openai/embeddings/langchain_openai.embeddings.base.OpenAIEmbeddings.html\", \"title\": \"Vector stores and retrievers\"}]-->\n",
    "\n",
    "from langchain_chroma import Chroma\n",
    "from langchain_community.embeddings import DashScopeEmbeddings\n",
    "\n",
    "embeddings = DashScopeEmbeddings(\n",
    "    dashscope_api_key=\"sk-a5985cc3833b4e63a980cd9914904ab0\",\n",
    "    model=\"text-embedding-v1\",\n",
    ")\n",
    "\n",
    "vectorstore = Chroma.from_documents(\n",
    "    documents,\n",
    "    embedding=embeddings,\n",
    "    persist_directory=\"./chroma_db\",\n",
    ")"
   ],
   "id": "c1cca246b9a5110f",
   "outputs": [],
   "execution_count": 14
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "在这里调用 .from_documents 将把文档添加到向量存储中。向量存储 实现了可以在对象实例化后调用的添加文档的方法。大多数实现将允许您连接到现有的向量存储——例如，通过提供客户端、索引名称或其他信息。有关特定 集成 的更多详细信息，请参阅文档。\n",
    "\n",
    "一旦我们实例化了一个包含文档的 向量存储，我们就可以对其进行查询。向量存储 包含用于查询的方法：\n",
    "\n",
    "同步和异步；\n",
    "通过字符串查询和通过向量；\n",
    "有和没有返回相似性分数；\n",
    "通过相似性和 最大边际相关性（以平衡查询的相似性与检索结果的多样性）。\n",
    "这些方法的输出通常会包含 文档 对象的列表。"
   ],
   "id": "33284ed9486d083a"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 示例\n",
    "\n",
    "根据与查询最相似的文档，我们可以使用向量存储的 `similarity_search` 方法进行查询。"
   ],
   "id": "8014aa22535d1145"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-24T06:57:02.401024Z",
     "start_time": "2025-09-24T06:57:02.157402Z"
    }
   },
   "cell_type": "code",
   "source": "vectorstore.similarity_search(\"cat\")",
   "id": "2e052f56cec38667",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(id='420ee249-d175-40e7-a8ca-3b15c55cdb6d', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='1300d1c9-7e87-4629-9e1b-ab80580397e2', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='b0a98ac2-874e-42f5-859a-29132ea4e9d4', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='285c4944-83e4-43d3-a287-f3d21b600d24', metadata={'source': 'mammal-pets-doc'}, page_content='Dogs are great companions, known for their loyalty and friendliness.')]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "#### 异步查询：asimilarity_search",
   "id": "3b81872c4d42bc0"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-24T06:57:02.668293Z",
     "start_time": "2025-09-24T06:57:02.405910Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 注意这边的方法是：asimilarity_search\n",
    "await vectorstore.asimilarity_search(\"cat\")"
   ],
   "id": "506bdb11b3da29e9",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(id='420ee249-d175-40e7-a8ca-3b15c55cdb6d', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='1300d1c9-7e87-4629-9e1b-ab80580397e2', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='b0a98ac2-874e-42f5-859a-29132ea4e9d4', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='285c4944-83e4-43d3-a287-f3d21b600d24', metadata={'source': 'mammal-pets-doc'}, page_content='Dogs are great companions, known for their loyalty and friendliness.')]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "#### 返回相似度的数值",
   "id": "b87df5526ebace96"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-24T06:57:02.900734Z",
     "start_time": "2025-09-24T06:57:02.674157Z"
    }
   },
   "cell_type": "code",
   "source": "vectorstore.similarity_search_with_score(\"cat\")",
   "id": "bc4b2d8f2afc22de",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(Document(id='420ee249-d175-40e7-a8ca-3b15c55cdb6d', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       "  10326.640625),\n",
       " (Document(id='1300d1c9-7e87-4629-9e1b-ab80580397e2', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       "  10326.640625),\n",
       " (Document(id='b0a98ac2-874e-42f5-859a-29132ea4e9d4', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       "  10326.640625),\n",
       " (Document(id='285c4944-83e4-43d3-a287-f3d21b600d24', metadata={'source': 'mammal-pets-doc'}, page_content='Dogs are great companions, known for their loyalty and friendliness.'),\n",
       "  13201.8525390625)]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "根据与嵌入查询的相似性返回文档：",
   "id": "85c300dd1cabd370"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-24T06:57:03.145173Z",
     "start_time": "2025-09-24T06:57:02.905621Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 把文本转成向量\n",
    "embedding = embeddings.embed_query(\"cat\")\n",
    "# print( embedding)\n",
    "vectorstore.similarity_search_by_vector(embedding)"
   ],
   "id": "8e41208f8ae8235f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(id='420ee249-d175-40e7-a8ca-3b15c55cdb6d', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='1300d1c9-7e87-4629-9e1b-ab80580397e2', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='b0a98ac2-874e-42f5-859a-29132ea4e9d4', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.'),\n",
       " Document(id='285c4944-83e4-43d3-a287-f3d21b600d24', metadata={'source': 'mammal-pets-doc'}, page_content='Dogs are great companions, known for their loyalty and friendliness.')]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "### 了解更多\n",
    "- [API参数](https://python.langchain.com/api_reference/core/vectorstores/langchain_core.vectorstores.VectorStore.html)\n",
    "- [使用指南](https://www.langchain.com.cn/docs/how_to/vectorstores/)\n",
    "- [集成特定文档](https://www.langchain.com.cn/docs/integrations/vectorstores/)"
   ],
   "id": "2e6b3a245002332b"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 检索器\n",
    "\n",
    "LanChain `VectorStore` 对象不继承 [Runnable](https://python.langchain.com/api_reference/core/index.html#module-langchain_core.runnables), 因此无法立即集成到LangChain表达式 [chains](https://www.langchain.com.cn/docs/concepts/#langchain-expression-language-lcel)中。\n",
    "\n",
    "LangChain[检索器](https://python.langchain.com/api_reference/core/index.html#module-langchain_core.retrievers)是Runnables, 因此它们实现了一组标准方法(例如，同步和异步的`invoke` 和 `batch` 操作)，并设计为可以纳入LCEL链中。\n",
    "\n",
    "我们可以自己创建一个简单版本，而无需基础 `Retriever`。如果我们选择希望用于检索文档的方法，我们可以轻松创建一个可运行的对象。下面我们将围绕 `similarity_search`方法构建一个："
   ],
   "id": "561c05905c1f80da"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-24T06:57:46.678788Z",
     "start_time": "2025-09-24T06:57:46.346485Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# <!--IMPORTS:[{\"imported\": \"Document\", \"source\": \"langchain_core.documents\", \"docs\": \"https://python.langchain.com/api_reference/core/documents/langchain_core.documents.base.Document.html\", \"title\": \"Vector stores and retrievers\"}, {\"imported\": \"RunnableLambda\", \"source\": \"langchain_core.runnables\", \"docs\": \"https://python.langchain.com/api_reference/core/runnables/langchain_core.runnables.base.RunnableLambda.html\", \"title\": \"Vector stores and retrievers\"}]-->\n",
    "\n",
    "from langchain_core.documents import Document\n",
    "from langchain_core.runnables import RunnableLambda\n",
    "\n",
    "retriever = RunnableLambda(vectorstore.similarity_search).bind(k=1) # select top result\n",
    "\n",
    "retriever.batch([\"cat\", \"shark\"])"
   ],
   "id": "6e928460eb1ab852",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[Document(id='420ee249-d175-40e7-a8ca-3b15c55cdb6d', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.')],\n",
       " [Document(id='285c4944-83e4-43d3-a287-f3d21b600d24', metadata={'source': 'mammal-pets-doc'}, page_content='Dogs are great companions, known for their loyalty and friendliness.')]]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "向量存储实现了一个 `as_retriever` 方法，该方法将生成一个检索器，特别是一个 [VectorStoreRetriever](https://python.langchain.com/api_reference/core/vectorstores/langchain_core.vectorstores.VectorStoreRetriever.html)。这些检索器包括特定的 `search_type` 和 `search_kwargs` 属性，用于识别调用底层向量存储的方法，以及如何对其进行参数化。例如，我们可以用以下方式复制上面的内容：",
   "id": "5f6efb6361549b8b"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-24T07:01:35.070584Z",
     "start_time": "2025-09-24T07:01:34.735680Z"
    }
   },
   "cell_type": "code",
   "source": [
    "retriever = vectorstore.as_retriever(\n",
    "    search_type=\"similarity\",\n",
    "    search_kwargs={\"k\": 1},\n",
    ")\n",
    "\n",
    "retriever.batch([\"cat\", \"shark\"])"
   ],
   "id": "f1b424faae342f6a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[Document(id='420ee249-d175-40e7-a8ca-3b15c55cdb6d', metadata={'source': 'mammal-pets-doc'}, page_content='Cats are independent pets that often enjoy their own space.')],\n",
       " [Document(id='285c4944-83e4-43d3-a287-f3d21b600d24', metadata={'source': 'mammal-pets-doc'}, page_content='Dogs are great companions, known for their loyalty and friendliness.')]]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
